5

这是 Nginx 学习总结的第三篇,上一篇介绍到了 Nginx 学习总结(2) —— 基本配置,这一篇会对Location 模块 做一些总结。我们知道,Location 模块 主要是用于针对某些特定的 URL 进行配置,可以由前缀字符串定义,也可以由正则表达式定义。

Location 匹配规则

location = /test.png {
    # 精确匹配
    [ configuration A ] 
}

location / {
    # 通用匹配,但是正则表达式和最长字符串会优先被匹配
    [ configuration B ] 
}

location /documents/ {
    # 前缀字符串匹配
    # 匹配任何以 /documents/ 开头的请求
    # 只有后面的正则表达式没有匹配到时,该配置才会被采用
    [ configuration C ] 
}

location ^~ /images/ {
    # 前缀字符串匹配
    # 匹配任何以 /images/ 开头的请求,匹配成功以后,会停止搜索后面的正则表达式匹配
    [ configuration D ] 
}

location ~* \.(gif|jpg|jpeg)$ {
    # 正则表达式匹配,匹配所有以 gif,jpg,jpeg 结尾的请求
    # 然而,所有请求 /images/ 下的图片会被 configuration D 处理,因为 ^~ 指令,匹配不到这一条规则
    [ configuration E ] 
}

location /images/abc/ {
    # 前缀字符串匹配
    # 只有去掉 configuration D 才能被匹配到
    [ configuration F ] 
}
  • = 精确匹配;
  • ^~ 提高前缀字符串的匹配优先级;
  • ~ 区分大小写的正则表达式匹配;
  • ~* 不区分大小写的正则表达式匹配;
  • / 通用匹配(因为所有的地址都以 / 开头,所以这条规则将匹配到所有请求),如果没有其它匹配,任何请求都会匹配到。

默认情况, Nginx 先进行前缀字符串匹配,然后进行正则表达式匹配:如果前缀字符串匹配到了,并且前缀字符串有^~ ,就不继续往下匹配正则表达式;如果没有这个^~ ,即使前缀匹配到了,也要进行正则表则式匹配,如果正则表达式匹配到了,就是用正则表达式的,没有就是用前缀字符串匹配到的路径。总结如下:

匹配优先级:精确匹配 >(^~) > 正则匹配 > 字符串(长 > 短)

Location 配置应用

1. 常用使用规则
# 第一个必选规则
# 直接匹配网站根目录,通过域名访问网站首页比较频繁,使用这个会加速处理,比如官网首页
location = / {
    root   /usr/share/nginx/html;
    index  index.php index.html index.htm;
}

# 第二个必选规则
# 处理静态文件请求,有两种配置模式,目录匹配或后缀匹配,任选其一或搭配使用
location ~* \.(gif|jpg|jpeg|png|css|js|ico)$ {
    expires 7d; # 用来设置 HTTP 应答中的 Expires 和 Cache-Control 的头标时间,来告诉浏览器访问这个静态文件时,不用再去请求服务器,直接从本地缓存读取就可以了
}
location ^~ /public/ {
    root /usr/share/nginx/html/laravel/public;
    expires 7d;
}

# 第三个必选规则
# 用来转发动态请求到后端应用服务器
location / {
    root   /usr/share/nginx/html;
    index  index.php index.html index.htm;
}
2. 配置临时跳转

有时,需要将原来的 URL 请求跳转到新的 URL 链接,但又不想使原来的 URL 失效,比如访问 http://jochen.com/test 时,需要跳转到 http://jochen.com/ ,此时可以配置一个跳转:

location = /test/ {
    return 302 http://jochen.com/;
}
3. 配置访问控制

有时,我们需要对访问做一些限制。比如,Nginx 的 ngx_http_stub_status_module 模块(该模块不是默认安装的,可以使用 --with-http_stub_status_module 编译安装)提供了查看 Nginx 运行的基本状态信息,我们只想让部分 IP 的人可以查看,此时可以配置一个访问控制:

location /nginx-status {
    # 在1.7.5版本之前,使用 stub_status on; 指令
    stub_status; 
    
    allow 127.0.0.1;
    allow 192.168.4.220;
    deny all;
}
4. 列出目录

Nginx 默认是不允许列出整个目录的。如需此功能,我们可以通过一下配置开启:

location / {
    root   /usr/share/nginx/html;
    autoindex on;             # 开启目录自动索引
    autoindex_exact_size off; # 默认为on,显示出文件的确切大小,单位是bytes。改为off后,显示出文件的大概大小,单位是kB或者MB或者GB
    autoindex_localtime on;   # 默认为off,显示的文件时间为GMT时间。改为on后,显示的文件时间为文件的服务器时间
}

参考文章

  1. nginx 服务器安装及配置文件详解
  2. 前端工程师学习 Nginx 入门篇
  3. Module ngx_http_stub_status_module

Jochen
846 声望85 粉丝

Stay hungry, stay foolish.